<!DOCTYPE html>
<html lang="en">
  <head>
    <meta charset="UTF-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>请求超时和网络异常以及如何取消</title>
    <style>
      #result {
        width: 200px;
        height: 100px;
        border: 1px solid #90b;
      }
    </style>
  </head>
  <body>
    <!-- 
        对于超时和网络异常，可以设置一些回调函数来提醒用户
        对于取消发送请求，可以使用
        xhr.abort() 这个方法，一调用就会取消当前的ajax请求
     -->
    <button id="btn">点击发送请求</button>
    <div id="result"></div>
    <script>
      const result = document.getElementById("result");
      const btn = document.getElementById("btn");

      btn.onclick = function () {
        const xhr = new XMLHttpRequest();
        //  超时设置(超时后取消请求的发起)
        xhr.timeout = 2000;
        // 超时的回调函数，在实际的开发过程中我们应该使用遮罩层，或则是div等
        xhr.ontimeout = function(){
            alert('网络服务请求超时')
        }
        // 网络异常的回调
        xhr.onerror = function(){
            alert('你的网络似乎出现了异常')
        }

        xhr.open("GET", "http://localhost:8000/delay");
        xhr.send();
        xhr.onreadystatechange = function () {
          if (xhr.readyState === 4) {
            if (xhr.status >= 200 && xhr.status < 300) {
              result.innerHTML = xhr.response;
            }
          }
        };
      };
    </script>
  </body>
</html>
